package algotrader;


import java.util.Date;

public class Order {
	
	private static int ordens  = (int) (System.currentTimeMillis()/7);
	private String id;
	private String orderID;
	private Estado estado;
	private Side side;
	private double executed;
	private Date expireDate;
	private Validade validade;
	private OrderType type;
	private String symbol;
	private double qty;
	double price;
	private double minQty;
	private double stopPrice;
	private double maxFloor;
	
	public enum Estado {
		NOVA,REGISTRADA,REJEITADA,PARCIALMENTE_EXECUTADA,EXECUTADA,CANCELADA,CONGELADA,EXPIRADA,RECOLOCADA
	}
	
	public enum Validade{
		DAY('0'), DATED('6'), VAC('1'), EOC('3');

		private char c;
		
		Validade(char c) {
			this.c = c;
		}
		public char getValue() {
			return c;
		}
	}

	public enum Side{
		BUY('1'), SELL('2');
		private char c;
		
		Side(char c) {
			this.c = c;
		}
		public char getValue() {
			return c;
		}
	}
	public enum OrderType {
		MARKET('1'), LIMIT('2'), MARKET_LIMIT('K'), STOP_LIMIT('4');
		private char c;
		
		OrderType(char c) {
			this.c = c;
		}
		public char getValue() {
			return c;
		}
		
	}
	
	public Order(String symbol, double qty, double price, Side buy, OrderType type, Validade validade) {
		ordens++;
		this.id = "ALG"+buy+ordens;
		this.estado = Estado.NOVA;
		this.symbol = symbol;
		this.qty = qty;
		this.price = price;
		this.side = buy;
		this.executed = 0;
		this.type = type;
		this.validade = validade;
		this.stopPrice = 0;
	}

	public Order(String symbol, double qty, Side buy, OrderType type, Validade validade) {
		ordens++;
		this.price = 0;
		this.id = "ALG"+buy+ordens;
		this.estado = Estado.NOVA;
		this.symbol = symbol;
		this.qty = qty;
		this.side = buy;
		this.executed = 0;
		this.type = type;
		this.validade = validade;
		this.stopPrice = 0;
	}

	public String getId() {
		return id;
	}

	public Side getSide() {
		return side;
	}

	public void setExpireDate(Date nextDate) {
		this.expireDate = nextDate;
	}

	public OrderType getType() {
		return this.type;
	}

	public String getSymbol() {
		return this.symbol;
	}

	public double getQty() {
		return qty;
	}

	public double getPrice() {
		return this.price;
	}

	public Validade getValidade() {
		return validade;
	}

	public Date getExpireDate() {
		return expireDate;
	}

	public void setMinQty(double i) {
		this.minQty = i;
	}
	
	public double getMinQty() {
		return minQty;
	}

	public void execute(double i) {
		this.executed += i;
		this.estado = Estado.PARCIALMENTE_EXECUTADA;
		if(this.executed >= this.qty)
			this.estado = Estado.EXECUTADA;
	}

	public void setType(OrderType type) {
		this.type = type;
	}

	public void cancel() {
		this.estado = Estado.CANCELADA;
	}

	public Estado getEstado() {
		return this.estado;
	}

	public void setEstado(Estado estado) {
		this.estado = estado;
	}

	public double getExecuted() {
		return executed;
	}

	public double getStopPrice() {
		return this.stopPrice;
	}
	
	public void setStopPrice(double stop) {
		this.stopPrice = stop;
	}
	
	public double getMaxFloor() {
		return this.maxFloor;
	}
	
	public void setMaxFloor(double maxFloor) {
		this.maxFloor = maxFloor;
	}

	public String getOrderID() {
		return orderID;
	}

	public void setOrderID(String orderID) {
		this.orderID = orderID;
	}

	public void setQty(Double double1) {
		this.qty = double1;
	}

	public void setPrice(double d) {
		this.price = d;
	}

	public void setTimeInForce(Validade validade) {
		this.validade = validade;
	}

	public void setId(String id2) {
		this.id = id2;
	}
}
